package org.skywork.gui.component.basic;

// *************************************************************************/
// Charada Soft
// Area de Desarrollo de Sistemas de Información
// *************************************************************************/
// Proyecto : SkyWork
// Archivo : BuscadorEntidades.java
// Descripcion : Clase BuscadorEntidades
// *************************************************************************/
// Version : 2.11.8
// Fecha de Creación: 01 de Enero de 2015
// Author : Daniel Andres Castillo Pedroza
// *************************************************************************/

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import javax.swing.ListSelectionModel;
import org.skywork.bll.control.component.BuscadorEntidadesControl;
import org.skywork.entitys.basic.Arrendatario;
import org.skywork.entitys.basic.Entidad;
import org.skywork.entitys.basic.IEntidad;
import org.skywork.entitys.system.SkyWorkConstants;
import org.skywork.gui.component.SkyWorkPane;
import org.skywork.gui.component.basic.interfaces.ISelectedEntidad;
import org.skywork.gui.system.MessageGUI;
import org.skywork.gui.system.SystemGUI;
import org.swing.container.ScrollerPane;
import org.swing.controller.Button;
import org.swing.controller.ComboBox;
import org.swing.controller.Label;
import org.swing.controller.List;
import org.swing.controller.TextBox;
import org.swing.objects.list.PrototypeListModel;
import org.tools.Result;

public final class BuscadorEntidades extends SkyWorkPane {
    
    // Atributos de la clase BuscadorEntidades
    
    private ISelectedEntidad selectedEntidad;
    private PrototypeListModel <Entidad> modelDatos;
    
    // Componentes de la clase BuscadorEntidades
    
    private Label etiTipoEntidad;
    private Label etiDato, etiBusqueda;
    private ComboBox <String> cmbBusqueda;
    private ComboBox <String> cmbTipoEntidad;
    private TextBox txtDato;
    private ScrollerPane scroll;
    private List <Entidad> listaEntidades;
    private Button btnBusqueda, btnSeleccionar;
    
    // Constructor de la clase BuscadorEntidades
    
    public BuscadorEntidades() {
        super(340,330); initComponents();
    }
    
    // Metodos sobreescritos de la clase BuscadorEntidades

    @Override
    protected void initComponents() {
        // Instanciando componentes del Panel
        etiTipoEntidad = new Label("Tipo de entidad",15,10,100,30);
        cmbTipoEntidad = new ComboBox(145,10,180,30);
        cmbTipoEntidad.addItem(SkyWorkConstants.ARRENDATARIO);
        cmbTipoEntidad.addItem(SkyWorkConstants.CODEUDOR);
        etiBusqueda = new Label("Tipo de busqueda",15,45,120,30);
        cmbBusqueda = new ComboBox(145,45,180,30);
        cmbBusqueda.addItem(SkyWorkConstants.POR_IDENTIFICACION);
        cmbBusqueda.addItem(SkyWorkConstants.POR_APELLIDOS_PERSONA);
        cmbBusqueda.addItem(SkyWorkConstants.POR_NOMBRE_EMPRESA);
        etiDato = new Label("Dígite dato parámetro para hacer busqueda",20,80,300,25);
        txtDato = new TextBox(20,105,300,30);
        btnBusqueda = new Button("Realizar busqueda",90,140,160,40);
        modelDatos = new PrototypeListModel(); listaEntidades = new List(modelDatos);
        listaEntidades.setCellRenderer(SystemGUI.getCellRenderer());
        listaEntidades.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
        scroll = new ScrollerPane(20,185,300,85); scroll.setViewportView(listaEntidades);
        btnSeleccionar = new Button("Seleccionar entidad",90,280,160,40);
        
        // Configurando componentes del Panel
        etiTipoEntidad.setVisual(SystemGUI.getLabel());
        etiBusqueda.setVisual(SystemGUI.getLabel());
        etiDato.setVisual(SystemGUI.getLabel());
        cmbTipoEntidad.setVisual(SystemGUI.getComponents(true));
        cmbBusqueda.setVisual(SystemGUI.getComponents(true));
        txtDato.setVisual(SystemGUI.getTextBox(true));
        btnBusqueda.setVisual(SystemGUI.getComponents(true));
        btnSeleccionar.setVisual(SystemGUI.getComponents(true));
        
        // Eventos de los componentes del Panel
        btnBusqueda.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                if (txtDato.isWrite()) {
                    busquedaEntidad();
                } // Nos disponemos ha realizar la Busqueda
                
                else {
                    SystemGUI.showMessage(MessageGUI.get(MessageGUI.SIN_DATO_BUSQUEDA),Result.WARNING);
                } // No ha digitado datos para realizar busqueda de Entidades
            } // Realizando la busqueda de las Entidades
        });
        
        btnSeleccionar.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                seleccionarEntidad();
            } // Seleccionando entidad de la Lista
        });
        
        // Insertando componentes del Panel
        add(btnSeleccionar); add(etiTipoEntidad); add(cmbTipoEntidad); add(etiBusqueda); 
        add(cmbBusqueda); add(etiDato); add(txtDato); add(btnBusqueda); add(scroll);
    }
    
    // Metodos de la clase BuscadorEntidades
    
    /**
     * Este método nos permite ejecutar la busqueda de una Entidad 
     * dependiendo del Tipo de Busqueda seleccionada en el Panel.
     */
    private void busquedaEntidad() {
        switch ((String) cmbBusqueda.getSelectedItem()) {
            // Se buscara por Número de Identificación
            case (SkyWorkConstants.POR_IDENTIFICACION) :
                busquedaPorIdentificacion();
            break;
                
            // Se buscara por Patrón de las Entidades
            case (SkyWorkConstants.POR_APELLIDOS_PERSONA) :
                buscarPorApellidos();
            break;
                
            // Se buscara por Patrón de las Entidades
            case (SkyWorkConstants.POR_NOMBRE_EMPRESA) :
                buscarPorNombreDeEmpresa();
            break;
        } // Se determina el tipo de Busqueda en el Sistema
    }
    
    /**
     * Este método nos permite buscar una Entidad en el Sistema, ya
     * sea una Persona o una Empresa atraves de su identificación.
     */
    private void busquedaPorIdentificacion() {
        Result result = null; // Objeto que contendra el resultado de la Busqueda
        
        switch ((String) cmbTipoEntidad.getSelectedItem())  {
            // Se buscara un Arrendatario en el Sistema
            case (SkyWorkConstants.ARRENDATARIO) :
                result = BuscadorEntidadesControl.buscarArrendatarioPorIdentificacion(txtDato.getText());
            break;
        } // Se buscara por tipo de Entidad
        
        if (result.isSuccess()) {
            IEntidad iEntidad = (IEntidad) result.getObject();            
            modelDatos.add(iEntidad.getEntidad());
        } // Se encontro una entidad con la Identificación establecida
        
        else {
            SystemGUI.showMessage(result);
        } // Mostrando mensaje de que no se encontro Entidad
    }
    
    private void buscarPorApellidos() {
        Result result = null; // Objeto que contendra el resultado de la Busqueda
        
        switch ((String) cmbTipoEntidad.getSelectedItem())  {
            // Se buscara un Arrendatario en el Sistema
            case (SkyWorkConstants.ARRENDATARIO) :
                result = BuscadorEntidadesControl.buscarArrendatarioPorApellidos(txtDato.getText());
            break;
        } // Se buscara por tipo de Entidad
        
        if (result.isSuccess()) {
            ArrayList <Arrendatario> arrendatarios = (ArrayList <Arrendatario>) result.getObject();
            for (Arrendatario arrendatario : arrendatarios) {
                modelDatos.add(arrendatario.getEntidad());
            }
            
        } // Se encontro una entidad con la Identificación establecida
        
        else {
            SystemGUI.showMessage(result);
        } // Mostrando mensaje de que no se encontro Entidad
    }
    
    private void buscarPorNombreDeEmpresa() {
        Result result = null; // Objeto que contendra el resultado de la Busqueda
        
        switch ((String) cmbTipoEntidad.getSelectedItem())  {
            // Se buscara un Arrendatario en el Sistema
            case (SkyWorkConstants.ARRENDATARIO) :
                result = BuscadorEntidadesControl.buscarArrendatarioPorNombreDeEmpresa(txtDato.getText());
            break;
        } // Se buscara por tipo de Entidad
        
        if (result.isSuccess()) {
            ArrayList <Arrendatario> arrendatarios = (ArrayList <Arrendatario>) result.getObject();
            for (Arrendatario arrendatario : arrendatarios) {
                modelDatos.add(arrendatario.getEntidad());
            }
            
        } // Se encontro una entidad con la Identificación establecida
        
        else {
            SystemGUI.showMessage(result);
        } // Mostrando mensaje de que no se encontro Entidad
    }
    
    /**
     * Este metodo nos permite ejecutar el proceso de selección 
     * de la Entidad con la que se va a realizar procesos.
     */
    private void seleccionarEntidad() {
        if (modelDatos.getSize() > 0) {
            if (modelDatos.getSize() == 1) {
                cargarTipoEntidad(modelDatos.getElementAt(0));
            } // Solo hay un elemento en la Lista
            
            else {
                int indexSelected = listaEntidades.getSelectedIndex();
                
                if (indexSelected != -1) {
                    cargarTipoEntidad(modelDatos.getElementAt(indexSelected));
                } // Ha seleccionado elemento de la Lista
                
                else {
                    SystemGUI.showMessage(MessageGUI.get(MessageGUI.SIN_SELECCIONAR_ENTIDAD),Result.WARNING);
                } // No ha seleccionado elemento de la Lista
            } // Existen varios elementos en la Lista
        } // Hay elementos en la Lista de Entidades
        
        else {
            SystemGUI.showMessage(MessageGUI.get(MessageGUI.SIN_ENTIDADES_LISTA),Result.WARNING);
        } // No hay elementos en la Lista de Entidades
    }
    
    /**
     * Este método nos permite establecer la entidad que se va a pasar atraves 
     * de la interfaz para ser procesada. Donde la entidad a ser procesada se establece
     * con un objeto <code>Entidad</code>.
     * 
     * @param entidad Entidad a establecer para el proceso
     */
    private void cargarTipoEntidad(Entidad entidad) {
        if (selectedEntidad != null) {
            selectedEntidad.selectedEntidad(entidad);
        } // No se ha establecido la Interfaz de seleccion de Entidad
    }
    
    /**
     * Este método nos permite agregar los tipos de entidades a buscar
     * dentro del componente. Donde el tipo de entidades se establece con un
     * objeto <code>String</code>.
     * 
     * @param tipoEntidad Tipo de Entidad a permitir busqueda en el Componente
     */
    public void addTipoEntidad(String tipoEntidad) {
        cmbTipoEntidad.addItem(tipoEntidad);
    }
    
    /**
     * Este método nos permite realizar la limpieza la Lista de los
     * tipo de Entidades a buscar en el componente.
     */
    public void cleanTipoEntidad() {
        cmbTipoEntidad.removeAllItems();
    }
}